package com.yonyougov.devops.cruxcisupport.roleenv;

import com.yonyougov.devops.cruxcisupport.role.RoleService;
import com.yonyougov.devops.cruxcisupport.roleenv.dto.AddMulRoleEnvRequestDto;
import com.yonyougov.devops.cruxcisupport.roleenv.vo.FindEnvIdsByRoleIdsDto;
import com.yonyougov.devops.cruxcisupport.roleenv.vo.RoleEnvPageByRoleIdDto;
import com.yonyougov.devops.cruxcisupport.roleenv.vo.RoleEnvPageByRoleIdVo;
import com.yonyougov.devops.cruxcisupport.util.CruxDevOpsIdGenerator;
import com.yonyougov.devops.fwc.core.dao.BaseDao;
import com.yonyougov.devops.fwc.core.entity.Pagination;
import com.yonyougov.devops.fwc.core.service.impl.BaseServiceImpl;
import org.springframework.stereotype.Service;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

/**
 * t_role_env服务实现
 */
@Service
public class RoleEnvServiceImpl extends BaseServiceImpl<RoleEnvEntity, BigInteger> implements RoleEnvService {
    private RoleEnvDao roleEnvDao;
    private final RoleService roleService;

    RoleEnvServiceImpl(RoleEnvDao roleEnvDao, RoleService roleService) {
        this.roleEnvDao = roleEnvDao;
        this.roleService = roleService;
    }


    @Override
    public BaseDao<RoleEnvEntity, BigInteger> getDao() {
        return roleEnvDao;
    }

    //<!--用户自定义代码开始-->

    @Override
    public void addBatch(List<RoleEnvEntity> params) {
        roleEnvDao.addBatch(params);
    }


    /**
     * 角色取消关联应用
     *
     * @param roleEnvIds
     */
    @Override
    public void deleteMulRoleEnvByPrimaryKey(List<BigInteger> roleEnvIds) {
        roleEnvDao.deleteBatchRoleEnvByPrimaryKey(roleEnvIds);
    }

    /**
     * 查询角色和环境的关联
     * 根据角色id查询,根据环境名称筛选
     *
     * @param roleEnvPageByRoleIdDto [com.yonyougov.devops.cruxcisupport.roleenv.vo.RoleEnvPageByRoleIdDto]
     * @return [com.yonyougov.devops.fwc.core.entity.Pagination]
     */
    @Override
    public Pagination<RoleEnvPageByRoleIdVo> findRoleEnvPageByRoleId(RoleEnvPageByRoleIdDto roleEnvPageByRoleIdDto) {
        List<RoleEnvPageByRoleIdVo> roleEnvPageByRoleIdVoList = roleEnvDao.findRoleEnvPageByRoleId(roleEnvPageByRoleIdDto);
        int totalCount = roleEnvDao.countRoleEnvByRoleId(roleEnvPageByRoleIdDto);

        return new Pagination<>(roleEnvPageByRoleIdDto.getMax(), roleEnvPageByRoleIdDto.getPageNum(), totalCount, roleEnvPageByRoleIdVoList);
    }

    /**
     * 查环境ids
     * 条件: 角色ids
     *
     * @param findEnvIdsByRoleIdsDto [com.yonyougov.devops.cruxcisupport.roleenv.vo.FindEnvIdsByRoleIdsDto]
     * @return java.util.List
     */
    @Override
    public List<BigInteger> getEnvIdsByRoleIds(FindEnvIdsByRoleIdsDto findEnvIdsByRoleIdsDto) {
        return roleEnvDao.findEnvIdsByRoleIds(findEnvIdsByRoleIdsDto);
    }

    /**
     * 当前用户能看到的环境
     * 条件: 权限过滤
     *
     * @return java.util.List
     * @throws Exception
     */
    @Override
    public List<BigInteger> getCurrentUserEnvIds() throws Exception {
        List<BigInteger> roleIds = roleService.getCurrentUserRoleIds();
        return roleEnvDao.findEnvIdsByRoleIds(roleIds);
    }

    /**
     * 角色关联环境
     *
     * @param addMulRoleEnvRequestDto [com.yonyougov.devops.cruxcisupport.roleenv.dto.AddMulRoleEnvRequestDto]
     */
    @Override
    public void addMulRoleEnv(AddMulRoleEnvRequestDto addMulRoleEnvRequestDto) {
        List<RoleEnvEntity> roleEnvEntities = new ArrayList<>();
        addMulRoleEnvRequestDto.getEnvId().forEach(envId -> {
            RoleEnvEntity roleEnvEntity = new RoleEnvEntity();
            roleEnvEntity.setId(new CruxDevOpsIdGenerator().generatorId(roleEnvDao));
            roleEnvEntity.setRoleId(addMulRoleEnvRequestDto.getRoleId());
            roleEnvEntity.setEnvId(envId);
            roleEnvEntities.add(roleEnvEntity);
        });
        addBatch(roleEnvEntities);
    }


    //<!--用户自定义代码结束-->
}
